// 数据库初始化脚本
require('dotenv').config();
const mysql = require('mysql2');
const bcrypt = require('bcrypt');

console.log('开始设置数据库...');

// 创建数据库连接（不指定数据库名称，用于创建数据库）
const connection = mysql.createConnection({
  host: process.env.DB_HOST || 'localhost',
  user: process.env.DB_USER || 'root',
  password: process.env.DB_PASSWORD || '',
  charset: 'utf8mb4'
});

// 连接数据库
connection.connect((err) => {
  if (err) {
    console.error('数据库连接失败:', err.message);
    if (err.code === 'ER_ACCESS_DENIED_ERROR') {
      console.log('\n访问被拒绝，请检查以下几点:');
      console.log('1. MySQL服务是否正在运行');
      console.log('2. 用户名和密码是否正确');
      console.log('3. 用户是否有足够的权限');
      console.log('\n解决方案:');
      console.log('- 如果是root用户，请确保密码正确');
      console.log('- 或者创建一个新用户，如admin_user');
      console.log('- 检查MySQL的用户权限设置');
    }
    process.exit(1);
  }
  
  console.log('数据库服务器连接成功!');
  
  // 创建数据库
  connection.query('CREATE DATABASE IF NOT EXISTS ?? CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci', 
    [process.env.DB_NAME || 'admin_manage'], 
    (error, results) => {
      if (error) {
        console.error('创建数据库失败:', error.message);
        connection.end();
        return;
      }
      
      console.log('数据库创建成功或已存在');
      
      // 使用数据库
      connection.changeUser({database: process.env.DB_NAME || 'admin_manage'}, (error) => {
        if (error) {
          console.error('切换数据库失败:', error.message);
          console.log('尝试直接连接到指定数据库...');
          
          // 如果切换失败，尝试重新连接
          connection.end();
          
          const directConnection = mysql.createConnection({
            host: process.env.DB_HOST || 'localhost',
            user: process.env.DB_USER || 'root',
            password: process.env.DB_PASSWORD || '',
            database: process.env.DB_NAME || 'admin_manage',
            charset: 'utf8mb4'
          });
          
          directConnection.connect((err) => {
            if (err) {
              console.error('直接连接到数据库失败:', err.message);
              directConnection.end();
              return;
            }
            
            console.log('成功连接到数据库:', process.env.DB_NAME || 'admin_manage');
            setupTables(directConnection);
          });
          
          return;
        }
        
        console.log('已切换到数据库:', process.env.DB_NAME || 'admin_manage');
        setupTables(connection);
      });
    });
});

// 设置表结构和数据
async function setupTables(connection) {
  // 创建用户表
  const createUsersTableQuery = `
    CREATE TABLE IF NOT EXISTS users (
      id INT AUTO_INCREMENT PRIMARY KEY,
      account VARCHAR(50) NOT NULL UNIQUE COMMENT '账号',
      name VARCHAR(50) NOT NULL COMMENT '姓名',
      password VARCHAR(255) NOT NULL COMMENT '密码',
      role ENUM('admin', 'user') NOT NULL DEFAULT 'user' COMMENT '角色',
      created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
      updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间'
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
  `;
  
  connection.query(createUsersTableQuery, (error, results) => {
    if (error) {
      console.error('创建用户表失败:', error.message);
      connection.end();
      return;
    }
    
    console.log('用户表创建成功或已存在');
    
    // 创建操作日志表
    const createLogsTableQuery = `
      CREATE TABLE IF NOT EXISTS operation_logs (
        id INT AUTO_INCREMENT PRIMARY KEY,
        user_id INT NOT NULL COMMENT '用户ID',
        user_name VARCHAR(50) NOT NULL COMMENT '用户名',
        ip_address VARCHAR(45) COMMENT 'IP地址',
        method VARCHAR(10) NOT NULL COMMENT 'HTTP方法',
        url TEXT NOT NULL COMMENT '请求URL',
        user_agent TEXT COMMENT '用户代理',
        request_params JSON COMMENT '请求参数',
        response_data JSON COMMENT '响应数据',
        status_code SMALLINT NOT NULL COMMENT '状态码',
        duration INT COMMENT '执行时间(ms)',
        created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
        INDEX idx_user_id (user_id),
        INDEX idx_created_at (created_at),
        INDEX idx_method (method),
        INDEX idx_status_code (status_code)
      ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='操作日志表'
    `;
    
    connection.query(createLogsTableQuery, (error, results) => {
      if (error) {
        console.error('创建操作日志表失败:', error.message);
        connection.end();
        return;
      }
      
      console.log('操作日志表创建成功或已存在');
      
      // 生成正确的密码哈希
      bcrypt.hash('123456', 10, (err, hashedPassword) => {
        if (err) {
          console.error('生成密码哈希失败:', err.message);
          connection.end();
          return;
        }
        
        console.log('生成的密码哈希:', hashedPassword);
        
        // 删除现有用户数据（强制更新）
        connection.query('DELETE FROM users WHERE account IN (?, ?)', ['admin', 'user'], (error, results) => {
          if (error) {
            console.error('删除现有用户失败:', error.message);
            connection.end();
            return;
          }
          
          console.log('已删除现有用户数据');
          
          // 插入默认用户
          const insertUsersQuery = `
            INSERT INTO users (account, name, password, role) VALUES 
            ('admin', '管理员', ?, 'admin'),
            ('user', '普通用户', ?, 'user')
          `;
          
          connection.query(insertUsersQuery, [hashedPassword, hashedPassword], (error, results) => {
            if (error) {
              console.error('插入默认用户失败:', error.message);
              connection.end();
              return;
            }
            
            console.log('默认用户插入成功');
            console.log('\n数据库设置完成!');
            console.log('默认账户:');
            console.log('- 管理员: admin / 123456');
            console.log('- 普通用户: user / 123456');
            
            // 查询并显示用户数据
            connection.query('SELECT id, account, name, role FROM users', (error, results) => {
              if (error) {
                console.error('查询用户数据失败:', error.message);
              } else {
                console.log('\n当前用户数据:');
                console.table(results);
              }
              
              // 查询并显示操作日志表结构
              connection.query('DESCRIBE operation_logs', (error, results) => {
                if (error) {
                  console.error('查询操作日志表结构失败:', error.message);
                } else {
                  console.log('\n操作日志表结构:');
                  console.table(results);
                }
                connection.end();
              });
            });
          });
        });
      });
    });
  });
}